人生第一次正式些觸到單位圓式在高中的時候,使用單位圓構成極坐標系介紹虛數 i=\sqrt{-1} ,與使用單位圓介紹三角函數。此次要藉著畫單位圓的過程學習畫圖技巧,順便回溫高中所學的圓形的數學表示式。
圓形的數學式如下圖,分別可以
y>0
與 y<0
共 2 段表示。分別使用不同圓形數學表示式來畫圖。
使用參數式方法畫的單為圓如下,係以原點為中心,半徑為 1 的圖形。若要以參數式的方法畫圓,需設定圓的參數,例如:theta = np.linspace(0, 2 * np.pi, n)
、x = i * np.cos(theta)
與 y = i * np.sin(theta)
。之後用ax.spines
指令設定 X 軸與 Y 軸的位置或有無,此處選擇把原本靠左側與下側的框線其到中央,當作 X 軸與 Y 軸,再把上方與右方的框線拿除 。還有,記得要開始圖前,建議先以 fig = plt.figure(figsize=[4, 4])
把圖片的長寬控制為相同,畫出來的圓才不會變成橢圓形的樣子。
# function 10: 單位圓
# 10-1 參數式
n = 1000
r = [1] * 10
fig = plt.figure(figsize=[4, 4])
for i in r:
# 0 to 2*pi
theta = np.linspace(0, 2 * np.pi, n)
x = i * np.cos(theta) # 參數式
y = i * np.sin(theta)
plt.plot(x, y, linewidth=3, color='#e48826')
ax = plt.gca()
# Re-arrange 4 axes spines
# 調整圖片 X 軸移至 0
ax.spines['left'].set_position(('data', 0))
# 調整圖片 Y 軸移至 0
ax.spines['bottom'].set_position(('data', 0))
# 拿掉右邊線
ax.spines['right'].set_visible(False)
# 拿掉上邊線
ax.spines['top'].set_visible(False)
ax.set_aspect(1)
# ax.set_xlim([-1.5, 1.5])
# ax.set_ylim([-1.5, 1.5])
plt.xlim([-1.5, 1.5])
plt.ylim([-1.5, 1.5])
plt.show()
第二種單位圓畫法為利用隱函數的特定,藉程式將圖形以等高線的形式呈現出來。Python 程式法如下,在畫圖前,先定義半徑長度、畫圖的範圍、隱函數。其中畫圖的範圍比較特別,先 np.linspace(-r, r, 1000)
生成*-r* 到 r 之間無數的位置。之後,以 np.meshgrid(x, y)
把原本分開的 x, y 編織成相連的網狀矩陣。把矩陣中的元素平方並將矩陣相加、減去半徑的平方,得到等一下畫等高線所使用的「高度」。最後,利用plt.contour(*)
畫高度為 1 的等高線,神奇的是,其恰好為一個單位圓!
# 10-2 隱函數 + 等高線
# 圓半徑
r = 1
x = np.linspace(-r, r, 1000)
y = np.linspace(-r, r, 1000)
X, Y = np.meshgrid(x, y)
# 定義隱函數
Z = X**2 + Y**2 - r**2
# 利用等高線畫隱函數
plt.figure(figsize=[4, 4])
plt.contour(X, Y, Z, levels=[0], colors=['#e48826',], linewidths=[3,])
plt.xticks(np.arange(-1.5, 1.5+0.5, 0.5))
plt.yticks(np.arange(-1.5, 1.5+0.5, 0.5))
# plt.xlim([-1.5, 1.5])
# plt.ylim([-1.5, 1.5])
plt.title(r'Plot of the Implicit Function $x^2 + y^2 - 1 = 0$')
plt.grid(True)
plt.show()
圓形不只可以常見的直角座標系表示,也可借極座標表示。極座標與直接座標的詳細介紹可以參考
師大范洪源老師的簡報。不過,這些不是本篇的重點,重點為使用極座標畫圖的方法。
首先,定義角度 theta
與半徑長 rho
。之後,設置極座標係 ax = plt.subplot(111, projection='polar')
,其中 111
依序為列、行、子圖,使用 projection='polar'
設定為以極座標投影標的。最後,利用在極座標下,以角度 theta
與長度 rho
畫出圓形。
# 10-3 極座標投影
theta = np.linspace(0, 2 * np.pi, 1000) # 0 到 2pi
rho = 1 # 圓半徑
plt.figure(figsize=[4, 4]) # 繪圖窗口
ax = plt.subplot(111, projection='polar') # 極座標系
# -------------------------
# 以上等價於:
# fig, ax = plt.subplots(figsize=[4, 4], subplot_kw=dict(projection='polar'))
# -------------------------
ax.plot(theta, rho * np.ones_like(theta), color='#e48826', linewidth=3)
ax.set_title(r'Polar Plot $x^2 + y^2 - 1 = 0$', va='bottom')
plt.show()
第 4 種畫單位圓的方法為我們最初學習到圓形的數學表示法,即以 y 大於 0 與 y 小於 0 分界畫圖。
# 10-4 分做 y>0 y<0 兩段
# y = sqrt(1 - x^2), if x >= 0
# y = -sqrt(1 - x^2), if x < 0
def f(x):
return np.sqrt(1 - np.square(x))
r = 1
x = np.linspace(-r, r, 100)
# 分上下兩段畫圓
plt.figure(figsize=[4, 4])
plt.plot(x, f(x), color='#e48826', linewidth=3)
plt.plot(x, -f(x), color='#e48826', linewidth=3)
# 空心圓
plt.plot(r, 0, 'o', markeredgecolor = (1, 0, 0.2, 1) \
, markerfacecolor=(0, 0, 0, 0),
markersize=9)
plt.plot(-r, 0, 'o', markeredgecolor = (1, 0, 0.2, 1) \
, markerfacecolor=(0, 0, 0, 0),
markersize=9)
plt.xlim([-1.5, 1.5])
plt.ylim([-1.5, 1.5])
plt.title(r'Plot of $2$ Functions $y = \pm \sqrt{1 - x^2}$')
plt.grid(True)
plt.show()
參考資料: